#ifndef BLOCKING_QUEUE_H_
#define BLOCKING_QUEUE_H_

#include "BlockingQueueCore.hh"

//
/**
 * \file BlockingQueue.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class BlockingQueue BlockingQueue.hh
 *	
 * 큐에 데이터가 있을 경우에 Queue 클래스와 같이 동작하지만, 큐가 비어있는 
 * 상태에서는 큐에 삽입(enqueue)이 있을 때 까지 대기한다.
 * 
 * 입력을 대기하기 위해서 - 즉, 데이터를 기다리는 스레드를 블럭킹 하기 위해서 -
 * 한 시그널(Signal)을 이용한다. 큐에 데이터가 입력되면 시그널을 발생시키고, 
 * 큐에서 데이터를 출력하면 시그널을 소비한다.
 * 
 * 또  Queue 클래스와 다른 점은 큐를 비울 때 - flush 메소드 호출 시 - 데이터 
 * 입력을 기다리는 스레드를 해방시켜 줘야 한다.
 * 
 * 마지막으로 Queue 클래스에 없는 인터페이스를 - release 메소드 - 지닌다. 
 * 이 인터페이스는 입력을 대기하는 스레드를 해방 시켜주는데 사용한다.
 * 
 * \warning
 * 
 * 출력은 - dequeue 메소드 - 항상 데이터를 반환하지 않는다. 타임 아웃 
 * 되거나 release 메소드가 호출되는 경우에는 NULL을 반환한다.
 */
class BlockingQueue : public BlockingQueueCore
{
public:
	/**
	 * \name BlockingQueue
	 */
	BlockingQueue();
	
	/**
	 * \name ~BlockingQueue
	 */
	virtual ~BlockingQueue();
};

#endif //BLOCKING_QUEUE_H_